package com.kl.controller;

import com.kl.config.Configure;
import com.kl.config.ModuleInfo;
import com.kl.dto.Field;
import com.kl.dto.Module;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.*;

@RestController
public class ModelController {

    Map<String, String> map = new HashMap<>();

    @PostMapping(value = "/build")
    public Map<String, String> buildPojo(@RequestBody Module module) {
        build(module);
        return map;
    }

    /**
     * 得到测试的数据
     */
    @GetMapping("/module")
    public Module module() {
        Module module = new Module();
        // 类名
        module.setName(Module.class.getSimpleName());
        // 表名
        module.setTableName("t_user");
        // 类注释
        module.setComment("这是一个测试类");
        module.setUri("www://http:localhost");
        // 属性类型必须传入全限定类名
        Field field1 = new Field("id", "java.lang.Integer", "Integer");
        Field field2 = new Field("name", "java.lang.String", "String");
        List<Field> fields = new ArrayList<>();
        fields.add(field1);
        fields.add(field2);
        module.setFields(fields);
        return module;
    }

    private void build(Module module) {
        try {
            Configure configure = new Configure();
            configure.initDefaultConfig();
            Configuration conf = new Configuration();
            // 加载模板文件(模板的路径)
            String baseDir = configure.getProjectRoot();
            conf.setDirectoryForTemplateLoading(new File(baseDir));
            // 从根目录下加载模板
            Template template = conf.getTemplate(configure.getTemplate());
            System.out.println("模板信息 = " + template);
            System.out.println("项目根目录 = " + baseDir);
            System.out.println("实体类所在路径 = " + baseDir + configure.getProject().getEntity().getPkg());
            // 定义输出对象绝对路径
            ModuleInfo entity = configure.getProject().getEntity();
            String finallyPath = baseDir + entity.getPkg();
            File file = new File(finallyPath);
            if (!file.exists()) {
                if (!file.mkdirs()) {
                    throw new RuntimeException("文件创建失败");
                }
            }
            // 构建输出的文件路径,生成的类名以前端传入的为准
            Writer out = new FileWriter(finallyPath + "/"
                    + (module.getName() == null ? entity.getModule() : module.getName())
                    + entity.getSuffix()
                    + ".java");
            // 渲染并输出
            Map<String, Object> root = new HashMap<>();
            root.put("entity", module);
            ModuleInfo aPackage = configure.getProject().getEntity();
            // 将com/kl/test/entity转换为com.kl.test.entity
            aPackage.setPkg(aPackage.getPkg().replaceAll("/", "."));
            root.put("project", configure.getProject());
            root.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
            template.process(root, out);
            System.out.println("转换成功");
            map.put("code", "200");
            map.put("message", "转换成功");
            out.flush();
            out.close();
        } catch (IOException | TemplateException e) {
            e.printStackTrace();
            map.put("code", "500");
            map.put("message", e.getMessage());
        }
    }
}
